﻿#pragma once

#include <string>
#include <SFML/System.hpp>
#include <queue>

#include "CardSet.h"
#include "Piece.h"

/**
* Zawiera klasę gracza i kolejkę graczy
*/
namespace Players {
	/**
	* Typ gracza
	* - LOCAL - Gracz lokalny, uzytkujący tę instancję programu
	* - REMOTE - gracz połącząny poprzez Internet
	* - AI - sztuczna inteligencja
	*/
	enum PLAYER_TYPE { LOCAL, REMOTE, AI };

	/**
	* Klasa gracza
	*/
	class Player
	{
		sf::Unicode::Text name; /**< Imię lub nick gracza */
		Cards::CardSet cards; /**< Karty, jakie gracz posiada */
		bool is_inactive; /**< Czy gracz jest aktywny, tzn. czy może wyprowadzać podejrzenia i oskarżenia */
		PLAYER_TYPE type; /**< Typ gracza */

	public:
		BoardItems::PlayerPiece* piece; /**< Pionek należący do gracza */

		/** @see Player(sf::Unicode::Text name, BoardItems::PlayerPiece*, PLAYER_TYPE, Cards::CardSet cards) */
		Player(sf::Unicode::Text name, BoardItems::PlayerPiece*, PLAYER_TYPE);
		/**
		* Inicjalizuje atrybuty odpowiednimi wartościami
		* @param name Imię gracza
		* @param piece Pionek należący do gracza
		* @param cards Karty należące do gracza
		*/
		Player(sf::Unicode::Text name, BoardItems::PlayerPiece*, PLAYER_TYPE, Cards::CardSet cards);
		/**
		* @return Imię gracza
		*/
		sf::Unicode::Text getName();
		/**
		* @return Karty gracza
		*/
		Cards::CardSet& getCards();
		/**
		* Ustawia gracza jako nieaktywnego
		*/
		void setInactive();
		/**
		* @return Prawda, jeśli gracz jest aktywny
		*/
		bool isActive();
		/**
		* @return Typ gracza
		*/
		PLAYER_TYPE getPlayerType();
	};

	typedef std::queue<Players::Player*> PlayersQueue; /**< Typ kolejki graczy */
}
